package lj.fx.tool;

import cn.hutool.core.lang.Opt;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import lj.fx.main.FxMain;
import lj.fx.tool.base.FactoryCtl;
import lombok.Data;
import lj.fx.tool.listen.PosListen;
import lj.fx.tool.listen.SizeListen;

/**
 * 窗口（Stage）操作类
 * @author: liuwenju
 * @date: 2023/6/9 13:21
 * @version: 1.0
 */
@Data
public class ToolStage {

    private Stage stage;

    /**
     * 场景
     */
    private Scene scene = new Scene(new Group());

    /**
     * 构造方法
     * @param stage
     */
    public ToolStage(Stage stage) {
        this.stage = stage;
    }

    /**
     * 设置窗口场景
     * @param scene
     */
    public void setScene(Scene scene) {
        stage.setScene(scene);
    }

    /**
     * 打开窗口
     * @param scene
     */
    public void openStage(Scene scene) {
        Stage stageT = new Stage();
        stageT.initOwner(stage);
        stageT.setScene(scene);
        stageT.show();
    }

    public void openStage(String path) {
        openStage(FactoryCtl.loadCtl(path).scene);
    }

    /**
     * 设置场景内容
     * @param root
     */
    public void setScene(Parent root) {
        scene.setRoot(root);
    }

    /**
     * 添加子窗口 - 子窗口关闭前父窗口不能操作
     * @param ownerStage
     */
    public void addChildrenWin(Stage ownerStage) {
        Opt.ofNullable(ownerStage).ifPresent(item -> item.initOwner(stage));
    }

    /**
     * 窗口图标设置
     * @param path
     */
    public void setWinIcon(String path) {
        stage.getIcons().add(new Image(path));
    }

    /**
     * 是否最大化
     * @param isMaximized
     */
    public void maximized(boolean isMaximized) {
        stage.setMaximized(isMaximized);
    }

    /**
     * 是否最小化
     * @param isIconified
     */
    public void iconified(boolean isIconified) {
        stage.setIconified(isIconified);
    }

    /**
     * 是否全屏
     * @param isFullScreen
     */
    public void fullScreen(boolean isFullScreen) {
        stage.setFullScreen(isFullScreen);
    }

    /**
     * 是否置顶
     * @param isAlwaysOnTop
     */
    public void alwaysOnTop(boolean isAlwaysOnTop) {
        stage.setAlwaysOnTop(isAlwaysOnTop);
    }

    /**
     * 添加尺寸监听
     * @param sizeListen
     */
    public void addSizeListen(SizeListen sizeListen) {
        stage.heightProperty().addListener((observable, oldValue, newValue) -> {
            sizeListen.onChangeHeight(newValue.doubleValue());
            sizeListen.onChange(stage.getWidth(), newValue.doubleValue());
        });
        stage.widthProperty().addListener((observable, oldValue, newValue) -> {
            sizeListen.onChangeWidth(newValue.doubleValue());
            sizeListen.onChange(newValue.doubleValue(), stage.getHeight());
        });
    }

    /**
     * 添加位置监听
     * @param posListen
     */
    public void addPosListen(PosListen posListen) {
        stage.xProperty().addListener((observable, oldValue, newValue) -> {
            posListen.onChangeX(newValue.doubleValue());
            posListen.onChange(newValue.doubleValue(), stage.getY());
        });
        stage.widthProperty().addListener((observable, oldValue, newValue) -> {
            posListen.onChangeY(newValue.doubleValue());
            posListen.onChange(stage.getX(), newValue.doubleValue());
        });
    }

}
